🔶章節:
🔹[開頭]
🔹[hash註冊登入練習]
🔹[會員網站設計]
🔹[資料庫、資料表建立]
🔹[加密過程]
🔹[網頁連接資料庫]
🔹[註冊處理]
🔹[總結]
如果影片中不清楚,需要補充的地方我會再添加到這邊~
👆教學中的[練習]程式碼一併附上,影片中會有每組的講解、說明更清楚👆
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    hashed_password VARCHAR(255) NOT NULL,
    salt VARCHAR(255) NOT NULL
);
<html>
<head>
    <title>註冊</title>
</head>
<body>
    <h2>註冊新帳號</h2>
    <form action="register.php" method="POST">
        帳號:<input type="text" name="username"><br>
        密碼:<input type="password" name="password"><br>
        <input type="submit" value="註冊">
    </form>
</body>
</html>
在註冊畫面中,我們請使用者填寫帳號密碼。
<?php
$servername = "伺服器名稱";
$username = "使用者名稱";
$password = "密碼";
$dbname = "資料庫名稱";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("連接資料庫失敗: " . $conn->connect_error);
}
$username = $conn->real_escape_string($_POST['username']);
$password = $conn->real_escape_string($_POST['password']);
// 生成隨機的鹽值
$salt = bin2hex(random_bytes(16));
// 將鹽值和密碼結合,使用雜湊函數計算雜湊值
$hashedPassword = hash('sha256', $password . $salt);
$sql = "INSERT INTO users (username, hashed_password, salt) VALUES ('$username', '$hashedPassword', '$salt')";
if ($conn->query($sql) === TRUE) {
    echo "註冊成功<br>";
    echo '<button onclick="window.location.href=\'loginWeb.php\'">前往登入頁面</button>';
} else {
    echo "註冊失敗: " . $conn->error;
}
$conn->close();
?>
<html>
<head>
    <title>登入頁面</title>
</head>
<body>
    <h2>登入</h2>
    <form action="login.php" method="POST">
        帳號:<input type="text" name="username"><br>
        密碼:<input type="password" name="password"><br>
        <input type="submit" value="登入">
    </form>
</body>
</html>
簡單的畫面,請使用者輸入帳號、密碼進行登入。
<?php
$servername = "伺服器名稱";
$username = "使用者名稱";
$password = "密碼";
$dbname = "資料庫名稱";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("連接資料庫失敗: " . $conn->connect_error);
}
$username = $conn->real_escape_string($_POST['username']);
$password = $conn->real_escape_string($_POST['password']);
$sql = "SELECT hashed_password, salt FROM users WHERE username='$username'";
$result = $conn->query($sql);
if ($result->num_rows == 1) {
    $row = $result->fetch_assoc();
    $storedHashedPassword = $row['hashed_password'];
    $salt = $row['salt'];
    // 使用輸入的密碼和鹽值計算雜湊值
    $hashedLoginPassword = hash('sha256', $password . $salt);
    // 比對計算的雜湊值和儲存的雜湊值
    if ($hashedLoginPassword === $storedHashedPassword) {
        echo "登入成功";
    } else {
        echo "登入失敗:密碼錯誤";
        echo '<button onclick="window.location.href=\'loginWeb.php\'">重新登入</button>';
    }
} else {
    echo "登入失敗:帳號不存在";
    echo '<button onclick="window.location.href=\'registerWeb.php\'">前往註冊頁面</button>';
}
$conn->close();
?>
使用 phpMyAdmin 創建一個名為 member 的資料表,並將註冊頁面收集的資訊存入裡面。
登入 phpMyAdmin:
http://localhost/phpmyadmin/(根據你的伺服器配置可能不同)。創建新的資料庫:
members_database,選擇「utf8_general_ci」作為編碼,然後點擊「創建」。創建 member 資料表:
在頂部選擇新建的資料庫(例如 members_database)。
在選項卡中選擇「結構」。
點擊「新建」,然後輸入資料表名稱,例如 member。
account:類型選擇 VARCHAR,設置為主索引。name1:類型選擇 VARCHAR,設置為需要的長度。name2:類型選擇 VARCHAR,設置為需要的長度。phone:類型選擇 VARCHAR,設置為需要的長度。mail:類型選擇 VARCHAR,設置為需要的長度,勾選「唯一」。hashed_password:類型選擇 VARCHAR,設置為需要的長度。salt:類型選擇 VARCHAR,設置為需要的長度。設定完成後,點擊底部的「保存」。
儲存設定:
SQL創建資料表:
在剛剛創建的資料庫下方,點擊資料庫名稱進入資料庫頁面,然後點擊上方的 "SQL" 選項卡。在 "SQL" 輸入框中,輸入以下 SQL 代碼來創建一個名為 member 的資料表:
CREATE TABLE member (
    account VARCHAR(255) NOT NULL PRIMARY KEY,
    name1 VARCHAR(255) NOT NULL,
    name2 VARCHAR(255) NOT NULL,
    phone VARCHAR(255) NOT NULL,
    mail VARCHAR(255) NOT NULL UNIQUE,
    hashed_password VARCHAR(255) NOT NULL,
    salt VARCHAR(255) NOT NULL
);
<html>
<head>
    <title>註冊會員</title>
</head>
<body>
    <h2>註冊會員</h2>
    <form action="register.php" method="post">
        <label>使用者名稱:</label>
        <input type="text" name="name1" required placeholder="輸入姓名"><br>
        <label>暱稱:</label>
        <input type="text" name="name2"placeholder="我們如何稱呼您"><br>
        <label>電話:</label>
        <input type="text" name="phone"><br>
        <label>郵件地址:</label>
        <input type="email" name="mail" required ><br>
        <label>密碼:</label>
        <input type="password" name="password" required placeholder="至少一個英文字母和一個數字,長度超過5"><br>
        <label>確認密碼:</label>
        <input type="password" name="confirm_password" required><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>
收集使用者會員註冊資料。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $servername = "伺服器名稱";
    $username = "使用者名稱";
    $password = "密碼";
    $dbname = "資料庫名稱";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("連接失敗: " . $conn->connect_error);
    }
    
    $name1 = $conn->real_escape_string($_POST['name1']);
    $name2 = $conn->real_escape_string($_POST['name2']);
    $phone = $conn->real_escape_string($_POST['phone']);
    $mail = $conn->real_escape_string($_POST['mail']);
    $raw_password = $_POST['password']; 
    $confirm_password = $_POST['confirm_password']; 
    
    $email_parts = explode('@', $mail);
    $account = $conn->real_escape_string($email_parts[0]);
    $error_message = "";
    if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
        $error_message .= "請輸入有效的郵件地址。<br>";
    }
    
    if (strlen($raw_password) <= 5 || !preg_match("/^(?=.*[A-Za-z])(?=.*\d)/", $raw_password)) {
        $error_message .= "密碼必須包含至少一個英文字母和一個數字,長度超過5。<br>";
    }
    
    if ($raw_password !== $confirm_password) {
        $error_message .= "確認密碼與密碼不一致。<br>";
    }
    
    $account_check_query = "SELECT * FROM member WHERE account = '$account' LIMIT 1";
    $result = $conn->query($account_check_query);
    if ($result && $result->num_rows > 0) {
        $error_message .= "帳號已存在,請選擇另一個帳號。<br>";
    }
    
    if (!empty($error_message)) {
    
        
        echo '<button onclick="goBack()">返回修改</button><br>';
    
        
        echo '<script>
            function goBack() {
                window.history.back();
            }
        </script>';
    }
    if (empty($error_message)) {
        
        $salt = random_bytes(16);
        
        $hashedPassword = hash('sha256', $raw_password . $salt);
        
        $sql = "INSERT INTO member (name1, name2, phone, mail, account, hashed_password, salt) VALUES ('$name1', '$name2', '$phone', '$mail', '$account', '$hashedPassword', '$salt')";
        if ($conn->query($sql) === TRUE) {
            echo "註冊成功,您的帳號為".$account;
						echo '<button onclick="window.location.href=\'loginWeb.php\'">前往登入頁面</button>';
        } else {
            echo "註冊失敗: " . $conn->error;
        }
    } else {
        
        echo $error_message;
    }
    $conn->close();
}
?>
這段程式碼主要功能是接收使用者的註冊資訊,進行輸入驗證,如果通過驗證則將資訊存入資料庫,並提供返回修改和前往登入頁面的按鈕。
我們成功地完成了一個簡單的註冊系統,能夠有效地收集使用者的註冊資料並將其安全地存儲到資料庫中。在這個過程中,我們運用了我們之前學習的 HTML 表單元素、PHP 資料處理和 MySQL 資料庫操作知識,並且學會了如何對使用者的密碼進行雜湊處理,以確保使用者敏感資料的保密性和安全性。
明天繼續呈現登入功能、畫面、葉面跳轉......